package com.by.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.by.entity.SysMenu;
import com.by.service.SysMenuService;
import com.by.mapper.SysMenuMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import java.util.Set;
import java.util.stream.Collectors;

/**
* @author 86176
* @description 针对表【sys_menu(菜单管理)】的数据库操作Service实现
* @createDate 2024-12-09 14:54:02
*/
@Service
/*    由于管理员用户登录后台管理系统的频率比较高，并且管理员所拥有的权限不会经常的发生变化，
    所以将每个管理员所拥有的权限存放到redis缓存中，可以提升系统的性能和用户体验，并且减轻数据库服务器的压力*/
//注解用于配置该类中会用到的一些共用的缓存配置，cacheName属性表示指定缓存的名字
@CacheConfig(cacheNames = "com.by.service.impl.SysMenuServiceImpl")
public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu>
    implements SysMenuService{
    @Autowired
    private SysMenuMapper sysMenuMapper;
    @Override
   /* 注解标记在方法上，Spring会在方法被调用后将其返回值缓存起来，以保证下次使用同样的参数来执行该方法时可以直接从缓存中获取结果，
    不需要再次执行该方法。key属性是用来指定Spring缓存方法的返回结果时对应的key*/
    @Cacheable(key = "#userId")
    public Set<SysMenu> queryUserMenus(Long userId) {
        // 根据用户ID查询菜单集合
        Set<SysMenu> sysMenus = sysMenuMapper.selectUserMenusByUserId(userId);
        // 判断菜单集合是否有值
        if (!CollectionUtils.isEmpty(sysMenus) && sysMenus.size() != 0) {
            // 将菜单集合转换为树结构
            sysMenus = translateMenusToTree(sysMenus,0L);
        }
        return sysMenus;
    }

    /**
     * 将菜单集合转换为树结构
     * @param sysMenus
     * @param pid
     * @return
     */
    private Set<SysMenu> translateMenusToTree(Set<SysMenu> sysMenus, Long pid) {
        // 获取菜单的根节点集合
        Set<SysMenu> roots = sysMenus.stream()
                .filter(menu -> menu.getParentId().equals(pid))
                .collect(Collectors.toSet());
        // 循环遍历父节点集合，根据指定父节点id查询子节点集合
        roots.forEach(r -> r.setList(translateMenusToTree(sysMenus,r.getMenuId())));
        return roots;
    }
}




